/**
 * 生成 n x n 的螺旋矩阵
 *
 * 1.坚持循环不变量原则，边界区间左闭右开
 * 2.while循环生成螺旋矩阵，就是二维矩阵（从左到右，从上到下，从右到左，从下到上）
 * 3.如果n是奇数的话，则需要单独处理中间的值
 */
function generateMatrix(n) {
  // 生成二维矩阵
  let arr = new Array(n).fill(0).map(() => new Array(n).fill(0));
  // 定义原点startX，startY
  let startX = 0,
    startY = 0;
  // 计算要转多少圈和中间的位置
  let loop = Math.floor(n / 2);
  let mid = Math.floor(n / 2);
  // 控制每一层填充的元素
  let offset = 1;
  // 填充的值
  let count = 1;
  // while循环 要确定循环多少圈
  while (loop--) {
    // 定义行和列的初始索引
    let rowIndex = startX,
      colIndex = startY;
    // 从左到右
    for (; colIndex < n - offset; colIndex++) {
      arr[rowIndex][colIndex] = count++;
    }
    // 从上到下
    for (; rowIndex < n - offset; rowIndex++) {
      arr[rowIndex][colIndex] = count++;
    }
    // 从右到左
    for (; colIndex > startY; colIndex--) {
      arr[rowIndex][colIndex] = count++;
    }
    // 从下到上
    for (; rowIndex > startX; rowIndex--) {
      arr[rowIndex][colIndex] = count++;
    }
    // 判断是否有中间值，也就是n是否为奇数
    if (n % 2 !== 0) {
      arr[mid][mid] = count;
    }
    // 更新offset和初始位置
    offset++;
    startX++;
    startY++;
  }
  return arr;
}
const res = generateMatrix(5);
console.log(res);
